package cn.elwy.rcp.ui.dialog;

import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.swt.widgets.Shell;

import cn.elwy.rcp.core.model.ui.progress.RunnableAdapter;
import cn.elwy.rcp.ui.progress.RunnableWithProgress;

/**
 * 进度执行窗口
 * 
 * @author HSQ
 */
public class ProgressDialog {

  private final RunnableWithProgress progress;
  private final ProgressMonitorDialog monitorDialog;

  private ProgressDialog(Shell shell, RunnableAdapter method, String taskName) {
    progress = new RunnableWithProgress(method, taskName);
    monitorDialog = new ProgressMonitorDialog(shell);
  }

  /**
   * 打开一个进度窗口
   * 
   * @param shell
   * @param method 进程执行的方法
   * @return 1为操作成功，0为用户取消操作，负数为操作失败
   */
  public static int open(Shell shell, RunnableAdapter method) {
    return open(shell, method, "正在运行程序,请稍后...", false, 100);
  }

  /**
   * 打开一个进度窗口
   * 
   * @param shell
   * @param method 进程执行的方法
   * @param taskName 窗口标题
   * @return 1为操作成功，0为用户取消操作，负数为操作失败
   */
  public static int open(Shell shell, RunnableAdapter method, String taskName) {
    return open(shell, method, taskName, false, 100);
  }

  /**
   * 打开一个进度窗口
   * 
   * @param shell
   * @param method 进程执行的方法
   * @param isCanceld 是否可取消执行过程
   * @return 1为操作成功，0为用户取消操作，负数为操作失败
   */
  public static int open(Shell shell, RunnableAdapter method, boolean isCanceld) {
    return open(shell, method, "正在运行程序,请稍后...", isCanceld, 100);
  }

  /**
   * 打开一个进度窗口
   * 
   * @param shell
   * @param method 进程执行的方法
   * @param taskName 窗口标题
   * @param isCanceld 是否可取消执行过程
   * @return 1为操作成功，0为用户取消操作，负数为操作失败
   */
  public static int open(Shell shell, RunnableAdapter method, String taskName, boolean isCanceld) {
    return open(shell, method, taskName, isCanceld, 100);
  }

  /**
   * 打开一个进度窗口
   * 
   * @param shell
   * @param method 进程执行的方法
   * @param taskName 窗口标题
   * @param description 窗口描述
   * @param isCanceld 是否可取消执行过程
   * @param sleep 睡眠时间（ms）
   * @return 1为操作成功，0为用户取消操作，负数为操作失败
   */
  public static int open(Shell shell, RunnableAdapter method, String taskName, boolean isCanceld, int sleep) {
    try {
      ProgressDialog dialog = new ProgressDialog(shell, method, taskName);
      dialog.monitorDialog.run(true, isCanceld, dialog.progress);
      if (dialog.progress.isCanceled()) { // 用户取消操作
        return 0;
      } else if (dialog.progress.getError() == null) { // 执行成功
        // MsgDialog.openInformation(shell, "操作执行成功！");
        return 1;
      } else { // 执行失败
        MsgDialog.open(shell, dialog.progress.getError());
        return -1;
      }
    } catch (Exception e) {
      MsgDialog.openError(shell, e);
      return -1;
    }
  }

  public Thread getThread() {
    return progress.getThread();
  }

}